--- a/librtmp/rtmp.c
+++ b/librtmp/rtmp.c
@@ -2077,6 +2077,29 @@ RTMP_SendClientBW(RTMP *r)
 }
 
 static int
+SendClientChunkSize(RTMP *r, int chunkSize)
+{
+  RTMPPacket packet;
+  char pbuf[256], *pend = pbuf + sizeof(pbuf);
+  int ret;
+
+  packet.m_nChannel = 0x02;	/* control channel (invoke) */
+  packet.m_headerType = RTMP_PACKET_SIZE_LARGE;
+  packet.m_packetType = RTMP_PACKET_TYPE_CHUNK_SIZE;
+  packet.m_nTimeStamp = 0;
+  packet.m_nInfoField2 = 0;
+  packet.m_hasAbsTimestamp = 0;
+  packet.m_body = pbuf + RTMP_MAX_HEADER_SIZE;
+
+  packet.m_nBodySize = 4;
+
+  AMF_EncodeInt32(packet.m_body, pend, chunkSize);
+  ret = RTMP_SendPacket(r, &packet, FALSE);
+  r->m_outChunkSize = chunkSize;
+  return ret;
+}
+
+static int
 SendBytesReceived(RTMP *r)
 {
   RTMPPacket packet;
@@ -3349,6 +3372,11 @@ HandleChangeChunkSize(RTMP *r, const RTMPPacket *packet)
       r->m_inChunkSize = AMF_DecodeInt32(packet->m_body);
       RTMP_Log(RTMP_LOGDEBUG, "%s, received: chunk size change to %d", __FUNCTION__,
 	  r->m_inChunkSize);
+      if (r->Link.protocol & RTMP_FEATURE_WRITE)
+        {
+          RTMP_Log(RTMP_LOGDEBUG, "%s, updating outChunkSize too", __FUNCTION__);
+          SendClientChunkSize(r, r->m_inChunkSize);
+        }
     }
 }
 
